/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package UsoMetodosYVariables;

/**
 *
 * @author Ayder
 * 
 * modificadores y controles de acceso para metodos y variables

Modificadores

CONTROL DE ACCESO:
 - VARIABLES:
	Default 	: Disponible para cualquier otra clase en el mismo paquete.
	
	
	Private		: Variables y Metodos solo pueden ser accedidos desde su propia clase. 
			  Para evitar completamente que un metodo o variable sea usado por ningun otra clase.
			  previenen que se puedan modificar variables sensibles en el funcionamiento.
			  las subclases NO pueden HEREDAR las variables ni metodos privados de la Superclase.

	Public		: Variables y Metodos totalmente disponibles para cualquier otra clase. 
			  las subclases HEREDAN las variables y metodos privados de la Superclase.

	Protected	: Limita el acceso a subclases de una clase y otras clases en el mismo paquete.
			  permite el acceso a subclases que se encuentren en otros paquetes.

	Encapsulacion:
	proceso que hace que las variables y metodos sean solo
	visibles dentro de la clase.

 - METODOS CON HERENCIA: Un metodo sobrescrito no puede ser mas restrictivo que el original. Si mas publico.

	Public		: los metodos declarados public en una superclase deben 
			  ser tambien PUBLIC en todas las subclases.
	
	protected	: los metodos declarados protected en una superclase deben 
			  ser tambien PUBLIC ó PROTECTED en sus subclases.No pueden ser Private.

	default		: los metodos declarados sin control de acceso en una superclase
			  No pueden ser Private en sus superclases.

    STATIC
    Nos permite crear metodos y variables de clase.
* 
* ABSTRACT
    en jerarquia de clases cuanto mas alta es una clase, mas generica es su definicion.
    No se pueden instanciar.

    funciona como un contenedor de comportamientos y atributos comunes compartidos por sus subclases.
 */

public class ContadorInstancia {
    private static int numInstancia = 0;
    
    //permite q la variable de instacia private pueda ser utilizado
    protected static int getCuenta(){
        return numInstancia;
    }
    //solo para la clase
    private static void addInstancia(){
        numInstancia++;
    }
    //Constructor
    ContadorInstancia() {
        ContadorInstancia.addInstancia();
    }
    
    public static void main(String[] args) {
         System. out. println( "Empezamos con " +
             ContadorInstancia. getCuenta() + " instancias") ;
         for (int  i = 0; i < 500; ++i){
             new ContadorInstancia() ;
         }
         System. out. println( "Creadas " +
             ContadorInstancia. getCuenta() + " instancias") ;
    }
    
}
